로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
11 포스트 생성 API 유닛 테스트 (POST 요청) | ✅ 편저: 코담 운영자
11강 - 포스트 생성 API 유닛 테스트 (POST 요청)
테스트 - 포스트 생성 API, POST 요청✨ 이번 강의 목표
- 로그인 상태에서 POST 요청으로 게시물이 정상 생성되는지 테스트
- 인증되지 않은 사용자가 POST 요청 시 어떻게 처리되는지 확인
- 테스트를 위한 이미지 파일 업로드 처리법 학습 (
SimpleUploadedFile
)
1. 테스트 개요 및 목표
POST 요청은 실제 데이터를 서버에 저장하는 동작입니다. 이번 테스트의 핵심은 다음과 같습니다:
- 로그인 상태의 사용자 → 이미지, 글 작성 후 정상 저장 여부 확인
- 비로그인 사용자 → 요청 시 로그인 페이지로 리디렉트 또는 지정된 뷰로 이동
- 업로드된 이미지와 텍스트가 Post 모델에 잘 저장되는지 검증
2. 테스트 코드 (사용자 기준)
tests/views/test_post_create.py
from django.core.files.uploadedfile import SimpleUploadedFile
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.test import TestCase
class TestPosts(TestCase):
"""
게시글(Post) 관련 기능 테스트
"""
def setUp(self):
"""
테스트 실행 전 초기 설정.
테스트용 유저 생성.
"""
User = get_user_model()
self.user = User.objects.create_user(
username='testuser',
email='testuser@example.com',
password='testpassword'
)
def test_get_posts_page(self):
"""
게시글 작성 페이지 접근 테스트 (GET 요청)
"""
url = reverse('posts:post_create')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'posts/post_create.html')
def test_post_creating_posts(self):
"""
로그인한 상태에서 게시글 작성 POST 요청을 테스트합니다.
- 로그인 성공 여부 확인
- POST 요청 성공 여부 및 올바른 템플릿 사용 확인
"""
login = self.client.login(username="testuser", password="testpassword")
self.assertTrue(login)
url = reverse('posts:post_create')
image = SimpleUploadedFile("test.jpg", b"whatevercontents")
response = self.client.post(url, {
'image': image,
'caption': "test test"
})
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "posts/base.html")
def test_post_creat_not_login(self):
"""
비로그인 상태에서 게시글 작성 시 리디렉션 테스트
"""
url = reverse('posts:post_create')
image = SimpleUploadedFile("test.jpg", b"whatevercontents", content_type="image/jpeg")
response = self.client.post(url, {
'image': image,
'caption': "test test"
})
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/main.html")
3. 테스트 설명
setUp()
: 테스트 실행 전 공통 유저를 생성합니다. 이 유저로 로그인하거나 테스트를 수행합니다.reverse()
: URL을 직접 문자열로 작성하는 대신 URL 이름을 기반으로 안전하게 가져옵니다.SimpleUploadedFile()
: 실제 이미지를 올리지 않고도 테스트를 위한 가상 이미지 파일 객체를 생성합니다.self.client.post(...)
: 클라이언트를 통해 POST 요청을 전송하고 결과를 확인합니다.assertEqual()
: 응답 상태 코드가 예상 값과 같은지 확인합니다.assertTemplateUsed()
: 응답이 어떤 템플릿을 사용했는지 확인합니다.
테스트 흐름
테스트 함수 | 목적 |
---|---|
test_get_posts_page |
로그인 없이 GET 요청 시 작성 페이지 반환 확인 |
test_post_creating_posts |
로그인 후 POST 요청 처리 및 템플릿 확인 |
test_post_creat_not_login |
비로그인 POST 요청 시 응답 코드와 템플릿 확인 |
실제 프로젝트에서는 POST 요청 후 리디렉션(
302
)이 이뤄지는 경우도 있으며, 이는 로그인 장치와 설정에 따라 달라질 수 있습니다.
4. 주요 개념 정리
- ``: 테스트 전마다 실행되는 초기 설정 함수
- ``: URL 네임을 통해 URL 문자열을 가져옴
- ``: 이미지/파일 없이 업로드 시뮬레이션 가능
- ``: 실제 POST 요청 테스트
- ``: 결과 상태 코드 및 데이터 비교
- ``: 응답에서 어떤 템플릿을 사용했는지 확인
✅ 정리
- 로그인한 사용자가 POST 요청으로 게시글을 성공적으로 생성하는지 테스트
- 비로그인 사용자가 접근했을 때의 처리 흐름 확인
- 파일 업로드와 템플릿 사용 여부까지 전반적인 유닛 테스트 커버
👉 다음 강의에서는 업로드된 이미지가 실제로 피드에 렌더링되고 출력되는 기능을 다룹니다.